采用自然语言直接与不同的知识载体形式,例如文档、数据库、图谱等,进行直接交互,将极大提升交互效率和体验。
数字时代,信息量正呈几何级增长。
对企业来说,大量的信息以各种不同的形式储存在计算机中。这些信息的储存形式可分为结构化与非结构化两个大类,例如企业中大类的说明文档、合同文档等就是以一种非结构化的形式存放的,而SQL数据库和图谱则是一种典型的结构化数据。日常工作中我们经常需要对这些资料进行查询、修改等操作。传统的交互模式,比如SQL,文本搜索等方式效率不高,体验也不够好,如果能以类似人类语言自然交流的交互方式则效果会好很多。
NL2X技术就是是采用自然语言直接与不同的知识载体形式进行直接交互的一种技术,X代表了不同的知识载体形式。我们通常使用自然语言进行信息的获取与传递,这个过程实际是以自然语言为媒介,与某种知识载体形式进行信息互换的过程,这会极大提升交互效率和体验。
追一科技一直致力于利用AI为企业员工与客户提供更加便捷、智能的交互方式。作为我们技术分享系列的第二篇文章,这次我们就来介绍一下追一科技如何采用NL2X技术,实现通过自然语言直接与文档、数据库以及图谱这三种不同的信息形式进行交互。
NL2Doc指的是直接采用自然语言的方式对无结构化的文档进行查询,并从中找到相应的答案。举例来说,在购买保险的过程中,购买者会针对保险产品的各个方面进行咨询。要回答这些咨询问题,往往需要专业的保险营销人员根据产品合同的文档内容进行回答,而现在这一过程则可以借助NL2Doc技术由机器来完成。 MRC模型 NL2Doc的核心是机器阅读理解技术(MRC),它的基本形式是采用深度学习模型对文档以及问题进行编码,通过数据驱动的方式训练模型,让模型从原文中定位出与问题相关的信息并给出答案。我们可以将不同的阅读理解形式按照任务类型大致划分为四种: 完形填空:任务形式为给定一篇文章,将文中部分单词隐去,让模型根据上下文预测被隐去部分的单词,以CLOTH 数据集为代表。完形填空任务的数据集易于构建,可以用准确率指标进行评价。这种任务形式的缺点在于任务的答案限定为原文中的一个词或实体,所以并不能很好的测试机器对自然语言的理解能力,且与实际应用相距较远。
多项选择:任务形式为给定一篇文章、相关问题和候选答案列表,让模型从候选答案中选择出正确答案,代表数据集有MCTest, RACE, CoQA等。由于提供了候选答案,答案的形式相较于完形填空而言更为灵活,构建数据集可以直接利用现有的语言测试中的多项选择题目,所以较为容易。而该任务形式的缺点在于,由于该任务要求从备选答案中选出正确答案,因此问题形式相对简单(已经提供了候选答案),模型的搜索空间相对较小。在实际场景的使用中,这种任务形式需要由其它的模块先将可能的答案候选进行召回(通常是采用各种文本检索的方式),然后在进行MRC过程。
片段抽取:任务形式为给定一篇或多篇文章,让模型从原文中抽取连续的片段作为问题的答案,代表数据集有SQuAD, WikiHop等。这种方式数据集相对容易构建,答案限定为原文中的子片段,相较于多项选择有了更大的搜索空间,也在一定程度上能测试机器对自然语言的理解能力,而这种任务形式也与实际的场景应用比较接近。 自由作答:给定一篇或多篇文章,让模型生成一个单词序列,使其尽可能接近原答案,以微软发布的MS MARCO数据集为代表。这种方式的任务答案形式非常灵活,能很好的测试模型对自然语言的理解,与现实应用最为贴近。但是这类任务的数据集构建相对困难,另外由于采用的是生成式模型,因此对模型的测评和生成式模型一样,精确的评价需要大量人工的参与。 2018年追一科技研发了MRC模型Z-Reader,该模型在R-NET的基础上进行了进一步改进。同时,根据业务的实际需求,NL2Doc系统要求所使用的MRC模型带有拒识能力。(拒识能力指的是当文档中没有问题的答案时,模型需要给出明确的指示以表明当前问题找不到答案。)因此我们对R-NET进行了相应的修改。Z-Reader采用的是片段抽取的方式,模型可以分为输入、编码、问题-文档融合、文档自融合以及预测模块这5个部分。
输入部分
在输入部分我们采用了问句以及文档的ELMo向量。同时我们发现在一些问题中,确定词的词性能给答案的定位提供明显的帮助。例如在问题“寿险危险保额的累积金额是多少?”中,“寿险危险保额”是一个专有名词,要从文档中找到相关的答案,则文档中的答案片段附近必定也会出现这个名词,因此让模型知道词性可以辅助定位到答案片段的位置。我们在输入部分加入了POS特征,显式地将词性等信息带入模型当中。另一个加入的额外特征是词共现特征,在对问题进行回答时,答案的片段附近通常会出现问题中相同的词,这一特征能够将这种关系显式地表现出来。我们通过对这两种特征进行拼接,然后输入模型。 文档编码 模型采用双向GRU分别对文档以及问题进行分开编码。假设输入的问题与文档的ELMo向量分别为 与 ,则采用如下的方式对文档和问题进行编码。 其中 代表拼接操作, 分别为POS与词共现特征。然而,在做阅读理解的时候,文档与问题是密切相关的,因此模型中需有对两者的编码进行交互,而“问题-文档融合”部分则起着这个作用。 问题-文档融合 问题与文档的融合目的是让两者的信息充分融合,这里的融合首先让问题的每个位置上的特征以当前文档位置的特征为基础进行注意力机制加权(attention)得到上下文表征 ,这种加权是希望按照当前位置的文档信息来体现问句中的重要部分。 加权后的上下文表征通过单个GRU模块再与文档表征进行融合成为带有问题信息的文档表征 而其中的 则加入了门控机制来体现当前的文档位置是否足够重要 经过融合后的文档编码 携带了完整的问句信息,但它只携带了当前位置的文档信息。而通常阅读理解的答案片段需要结合全局的文档信息来考虑,因此仅使用这个编码是不足够的。通常来说我们可以在后面再加上一层RNN来解决这个问题,但RNN虽然在理论上能编码无限长的序列,但实际上却经常只局限在短程内的信息上。因此这里需要一个类似于Transformer结构中的自注意力(self-attention)机制来让编码携带上全文信息。同时在这一步中我们加入了拒识标识位,该位置与文档一起输入编码层,进行“问题-文档融合”的计算。 文档自融合 文档自融合的作用则是让当前位置上的文档特征融合整个文档的信息内容。它采用的依然是类似于上一步中“问题-文档融合”的结构。 其中 是文档采用注意力机制计算,基于自身的上下文表征
同理 也是按问题-文档融合步骤中的方法计算的门控输出。在这一步中,拒识标识也一样参与计算。 答案预测 答案预测部分采用的是指针网络(Pointer Network)来预测答案片段的开头与结尾两个位置。指针网络本身也是一个GRU,但由于只需要预测开头和结尾,因此它实际的长度是2。由于开始和结束位置上有可能输出文档中全部词的某一个,因此做法是使用指针网络来指向文档中的某个词,如下:
由于只需要开始和结尾位置,因此 。其中 则为指针网络在第 位置上的输出向量,计算方式如下
同时,在答案预测部分,拒识标识会进行一个二分类输出,给出当前问题在文档中是否有存在答案的预测,如果该预测大于某个预设阈值,则任务该文档当中没有问题的答案。 追一科技在阅读理解技术上有着长期的探索与积累,我们在2018年中文信息学会举办的中文阅读理解竞赛CMRC2018中获得了冠军。此后我们又对NL2Doc中的MRC模型进行了调整,换成了基于大型预训练模型的结构,在系列文章的 第一篇 中对这些大型的预训练模型进行了详细的介绍。在2019年我们再次在斯坦福大学发起的对话式问答挑战赛CoQA中获得榜单第一名,这是算法模型在这个榜单上首次超越人类成绩。关于追一科技在各项比赛中的成绩与介绍,将会在未来的文章中详细介绍。
功能模块 为了适应实际场景的需求,追一科技的NL2Doc系统中除了模型部分外,整个系统可以划分为运营平台、标注平台、训练平台以及服务平台四个功能模块。 运营平台是NL2Doc的管理后台,负责模型的上下线以及文档的增删改等操作,而模型训练所使用的数据可以在标注平台进行标注,标注完成后可以发起训练,模型则会在训练平台上进行训练,训练完成后模型会被推送到服务平台进行在线服务。 标注平台 标注平台给使用者提供了简单快捷的标注入口。如果我们想针对性地对某些领域的数据进行标注来微调模型,那么这个标注的过程则可以在标注平台完成。
上传的待标注文档将会显示在页面当中,针对文档中与答案有关的片段,可以直接选定并创建标注,然后输入相应的问题。执行完标注操作后,相应的片段则被视为创建出的问题的答案片段,为模型的训练提供依据。 训练平台 训练平台主要提供模型训练的能力。在标注平台中标注的数据会被推送至这里进行训练。同时在运营平台中选定的上线文档集合会在模型训练完成以后,经过导出模块与模型一起打包发送到服务平台。
将训练好的模型与在线文档绑定的目的是因为在教育调优过程中,通常是针对某个在线文档集出现的一些badcase对模型进行调整,因此这种绑定的方式能够明确将调优的模型版本与在线文档进行对应关联。
服务平台 服务平台是模型提供对外服务的部分,它包含了中控、文档解析服务、检索服务以及线上服务四个部分。通过标注平台标注的数据会由中控向训练平台发起模型的更新训练任务。此外考虑到模型训练完成后,在线文档也可能会根据业务需要进行一些更新,因此NL2Doc系统也具备在线文档热修改的功能。用户可以通过运营平台对在线服务中的被阅读文档进行修改,而这部分文档通过文档解析服务处理后,会通过中控直接进入在线服务的文档库中,作为被阅读的文档。 在实际使用的场景中,文档的数量非常大。因此在MRC模型进行文档阅读之前,我们会针对输入的问题,对全量文档进行检索,被召回后的文档才会通过MRC模型进行进一步的阅读理解。对文档先进行召回的目的是因为阅读理解模型通常是大型的神经网络模型,耗时较高,所以采用检索召回的方式来降低模型需要阅读的文档数量,以保证NL2Doc系统的性能。召回的文档会被送入在线服务模型。我们采用TF-Serving挂载阅读理解模型进行在线服务,召回的文档会按照前面介绍的方法进行前处理,提取POS特征与词共现特征,然后进入模型推理阶段。 NL2SQL是指让普通使用者可以在不懂SQL数据库相关专用语言 (SQL语言)的前提下,直接通过自然语言对已有的SQL数据库进行相关操作的一种技术。在企业的众多资料信息中,SQL数据库是一种典型的储存结构化数据的方式。在实际场景中,对SQL数据库的查询需要使用专门的SQL语句进行,这给非专业人士设置了门槛。而另一方面,企业员工或客户对企业数据的查询又非常普遍,许多自然语言的查寻逻辑实际上可以直接对应到SQL语句上,例如下图的例子: “哪些城市本周成交量大于200平方米”可以直接转换为SQL语句 SELECT City FROM TABLE WHERE This week>20
。而借助NL2SQL,可以将自然语言直接转换为SQL语句,并对数据库进行查询。 NL2SQL模型 与NL2Doc系统一样,NL2SQL系统中最核心的功能是由深度学习模型完成的。模型会对输入的自然语言询问以及SQL表格进行处理,然后返回完整的SQL语句。通常来说,输入模型的内容包括了原本的自然语言问句,以及与表格相关的信息内容(schema),如下图所示: 从本质上看,自然语言转化为SQL语句主要需要解决两个核心问题: schema linking: 找到自然语言中的相关信息片段,并与表格的schema(表名、列名以及值)进行关联。例如上图中的例子中需要找到“陈启超和李四”关联到表格的“姓名”列; logic linking: 找到自然语言中的相关逻辑表达,并与SQL语句的逻辑表达进行关联。这种关联通常体现在SQL的聚合函数、条件逻辑等方面。例如需要将自然语言中的“最大、多少”等逻辑表达与SQL语句中的“MAX,COUNT”等关键词进行关联。 当前的NL2SQL模型在schema linking的问题上投入了较多的关注,许多模型设计会采用特别的结构来加强shema linking的能力,例如为表名、列名以及值设计特殊的编码方式等;而针对logic linking的设计则较少。 目前将自然语言通过模型转化为SQL语句主要有两种方式,一种是将SQL语句拆分为多个子任务,通过多任务学习来让模型完成各个子任务的预测,然后再组合为SQL语句。另一种方式是采用生成式,即模型通过对问句以及表的相关信息进行编码以后,直接生成出SQL语句。这两种方式各有优缺点。直接生成式的方案在解码时更加简单,适合进行跨表查询的情况。而拆分为多任务的形式则会让NL2SQL系统更具可解释与可控性,因为在多任务形式下,SQL的每个关键词(例如SELECT,WHERE等)被拆分为不同的任务,模型会分别输出这些子任务的预测。因此在将这些输出重组为SQL语句的过程中,我们可以根据模型的单个任务输出进行后处理来让整个NL2SQL系统更加可控。 由于在工业场景下生成式的NL2SQL模型对标注数据的需求量较多,并且相比于多任务的方式更加不可控。为了保证实际场景应用中系统的可控性以及尽可能降低对数据量的需求,追一科技采用多任务方式的NL2SQL模型。 从SQL语句的结构来看,我们可以将其拆解为选择列以及条件两个大的部分,分别对应了 SELECT
以及 WHERE
这两个关键词。而选择列则可以进一步拆解为选择多少列(select-number)、选择哪些列(select-column)以及选择列的集合关系(select-aggregation)。而条件部分则可以进一步拆解为条件数量(where-number)、条件指定的列(where-column)、条件的类型(where-operator)以及条件的值(where-value)。除此以外,我们还加入了拒识(rejection)与表值感知(where-relation)两个部分。模型的编码部分采用了大型的预训练模型(关于大型预训练模型的介绍可以回看以前的 文章 ),在这里我们主要介绍上述任务的具体计算方式。我们将输入的问句以及所有的列名用[SEP]字符间隔并拼接为一个长序列,然后通过预训练模型进行混合编码,设 为第 个列名中第 个字的输出,我们以表列名的[SEP]位置输出为表列的整体表征 select-number select-number的目的是确认选择的列的数量,我们先对所有的列进行自注意力计算出所有列的上下文特征 ,然后用上下文特征对问句中的每个字特征进行加权计算,得出融合列信息的问句表达:
其中 为模型参数,即我们对计算出的 进行分类来确定选择的列的数量 select-column select-column的目的是确定选择的列,我们先对问题中所有的词进行自注意力计算得出问句的上下文特征 ,然后用上下文特征对每个列中的每个词进行加权计算,得出融合问句信息的列表达:
select-aggregation select-aggregation的目的是确定列的聚合操作方式,一共包含 [Null, AVG, MAX, MIN, COUNT, SUM]
这几种,我们采用与计算select-column同样的特征来进行分类预测:
where-number where-number指的是SQL语句中在 WHERE
后条件语句的数量。我们把这个问题作为了一个分类问题来处理,即设定一个固定上限,比如说最多6个condition,然后做6分类。具体的做法和select-number一样:
where-column where-column是用来确定条件中列的位置的任务,如select-column一样,我们对每列的位置进行二分类来判断是否属于条件中的列:
where-operator where-operator是用来确定条件中列的具体操作,我们定义了 [>,<,==,!=]
四种条件操作,类似于select-aggregation那样,我们采用分类的方式来进行训练。
where-value where-value指的是在SQL中 WHERE
后的条件语句中,找到被提及的、与问句中相关的片段。针对问句中的每一个字,我们计算它与每一个表的关系,并以此确定value片段以及该片段属于哪一个列: 其中 代表问句中第 个字为第 个表列的value的概率。 追一科技在2018年就开始对NL2SQL进行研究,是国内对该技术进行研究与落地最早的企业之一。在2019年我们举办了首届中文NL2SQL挑战赛,并提供了全球首个中文NL2SQL数据集,填补了中文在NL2SQL这一技术领域上的空白。这次比赛共有1457来自于企业、科研院校的队伍参加,最终复赛的最佳成绩达到92%,这一比赛在中文NL2SQL技术积累与发展中起到了巨大的推动作用。 NL2SQL系统 NL2SQL系统中整体可以分为前端服务、后端平台、解析引擎以及执行引擎四个模块。其中解析引擎是NL2SQL系统的核心功能部件,其中包括信息抽取、表格筛选、模型以及指令编辑四个子模块。 信息抽取与表格筛选 在问句进入模型前,会先对其中的关键信息进行抽取,用于表格的筛选。虽然NL2SQL模型理论上可以编码多张表格,但为了提高系统的性能我们会对所有的表格进行一次预筛选。方式是用问句中抽取出的信息对所有表的表名以及表头进行检索,召回头部的表格再送入模型当中。 指令编辑 在实际使用时,用户经常会对相同类型的查询进行多次细微的修改以确定最终想要的信息。为了让这种重复查询更加便利,需要让用户可以直接在上一次查询的语句上做局部修改即可。 如上图所示,第一次查询的结果会在前端界面上显示,而页面上端会显示这次查询的关键字段,如果再次查询只更改某个字段,可以直接在关键字段上进行编辑而不用重新输入自然语言问句。指令编辑的输入则不需要再次经过模型的解析,直接以SQL语句的形式返回给后台处理。这在提高使用便利性的同时也提升了系统性能。 NL2Graph方法 NL2Graph是以知识图谱作为结构化数据的存储媒介,将自然语言转化为知识图谱的子图或SPARQL、CYPHER等图查询语句的技术。知识图谱是以实体、关系、属性组成的三元组为最小单元构建的网状联通的结构化知识。知识图谱有着与关系型数据库相同的优点:可计算、可高效检索。另一方面,与关系型数据库相比,知识图谱的结构更加灵活、其检索和推理模式更加贴近自然语言,令其尤为适合作文本结构化的存储和检索媒介。 目前NL2Graph的两大主流技术是语义解析方法(Semantic Parsing)和信息提取方法(Information Retrieval)。语义解析方法将自然语言转化为图查询语句,在知识图谱中执行后获得匹配的子图;而信息提取方法直接将自然语言与知识图谱中的子图匹配。两者的区别可用下图表示: 信息提取方法 信息提取方法分为召回和打分排序两个阶段。知识图谱的子图数量与知识图谱本身的规模呈指数增长关系,因此在召回阶段必须限制召回的子图数量,一般会采用锚定话题实体(Topic Entity)限制目标实体,即答案到话题实体的跳数(Hop)的方法得到有限个候选子图。如果跳数限制为1,则得到的子图为一个三元组,能用一个三元组回答的问句被称为简单问句(Simple Question)。 在打分排序阶段,将所有候选子图与问句进行相似度匹配打分。对于简单问句,实体、关系和属性均可被编码为三元组的分布式表示,与问句的分布式表示拼接后通过神经网络模型计算出相似度。此外,实体的类型、关联实体、外部常识信息等也可以被加入编码,提高模型的泛化性和匹配效果。 由于子图数量正比于图结点度数的跳数次方,因此对于跳数大于1的非简单问句,一般采用分阶段召回-排序的策略,每个阶段召回一跳的候选三元组,排序后只保留得分topK的候选集,进入下一跳的召回-排序。键-值记忆网络、强化学习等方法被用于每个阶段的排序-打分策略。这种分阶段策略和基于Beam Search的方法使信息提取在多跳问题上也能获得不错的可扩展性(Scalability),为其赋予了一定的推理能力。 信息提取方法直接将问句与子图匹配,省去了执行查询语句的过程,这是它的一个优点,也是一个局限。首先,信息提取方法要求每个问句都包含一个话题实体(例句:科比的职业生涯中,单场得分最高是多少分? 对应的话题实体是科比 - 篮球运动员 ),对于没有话题实体的问句,信息提取方法就无能为力(例句:哪些人既当过NBA球员又当过NBA教练? )。其次,信息提取方法只适用于一跳或多跳的事实类问题,即可以用一个或一条链状的三元组“回答”的问题,对于复杂问句,比如条件筛选类、逻辑比较类问句,信息提取方法无法回答。 语义解析方法 语义解析方法将问句与结构化查询语句(Structured Query)相匹配,知识图谱常用的结构化查询语句为SparQL(查询图RDF数据库)、Cypher(查询Neo4J图数据库)等。 上图所示的Cypher语句表达的含义是“列出和Tom Hanks合作过的演员的所有作品”,我们可以看到语义解析方法可以表达这类带有条件筛选、逻辑推理复杂问句,其表达能力要强于信息提取方法。 早期的语义解析方法将问句进行组合范畴语法(combinatory categorical grammar, 简称CCG)解析,并将解析到的语法树直接映射为无事实查询图(ungrounded graph, 即不含实体、关系、实体类型信息的查询图框架)。查询图框架补充了事实类信息后得到的查询图可以映射为SparQL查询语句。由于事实类信息的补充方法不止一种,一般将候选的查询图与问句进行相似度匹配-排序。 语义解析方法处理多跳复杂查询图时,也会面临信息提取方法一样的组合爆炸问题,分阶段构建查询图加Beam Search的策略自然也可以用于解决这一问题。比较成功的有Bao等人提出的STAGG方法和Hu等人提出的State-transition Framework (STF)等方法,它们的基本思路都是将查询图构建过程拆解为若干种原子操作,将查询图构建问题转化为寻找最优原子操作组合的问题。图构建的每一步的选择空间都有限,并使用深度学习模型,以原始问句和每一步涉及的子图片段的分布式表示作为输入,通过相似度匹配打分,学习选择的策略,同时用Beam Search限制体系的整体复杂度。 上图展示了分步语义解析方法拆解问句"Who first voiced Meg in Family Guy?"的步骤,包括了话题实体锚定,推理链拓展和限制、聚合添加三类原子操作。其中用了实体链接模型对话题实体锚定步骤打分,并用了一个交互式的匹配模型对推理链拓展步骤打分。 知识图谱问答机器人 知识图谱问答机器人是对NL2Graph技术的工程化应用,除了对NL2Graph技术的落地外,我们针对工程和业务场景的复杂性,探索出了一套方法论。 实体识别 - 子图匹配模块 作为在线问答的第一个模块,实体识别模块负责识别用户问句中的实体。这里的实体既包括图谱中的文本类实体,如人名、产品名等;也包括图谱中的数值类属性。对于数值类属性,利用图谱内置的单位归一化规则和业务泛化规则,将其转化为可计算的归一化数值,便于后续的结构化查询模块使用。值得一提的是,经过简单的配置,业务泛化规则可以支持将“预算20万左右,推荐个SUV”,“我老爸已经退休了,还能买XX保险吗?”这类问句中的“左右”,“退休”等模糊性和常识性文本转化为数值片段,用于后续计算。这也体现了知识图谱擅长计算性和逻辑性问答的特点。 子图匹配模块将用户问句匹配到一个知识图谱的子图。虽然分步构建查询图的语义解析方法所生成的查询图,它的复杂度能够满足实际场景的需求,但是查询图的标注是一个难点。 实践中,我们借鉴了语义解析方法中分步构建查询子图的思路。第一步,我们复用FAQ问答机器人的意图匹配模型,将问句匹配到查询子图框架,这里的框架只包括本体的实体类型、属性类型节点和关系边,是一个“概念查询子图”。限制最大跳数以后,这种概念查询子图的数量有限,可以枚举并训练匹配模型。这里,由于标注查询图的成本比较高,且由于我们积累了大量相似问法的行业语料,我们使用“问句 - 相似问句”,而非“问句 - 查询子图”的匹配模型。 一般来说,双塔模型和交互式模型都可以用作子图匹配模型,交互式模型效果略好但是有更大的在线计算量,实践中双塔模型可以满足大部分垂直领域知识图谱的子图匹配需求。 第二步,我们将实体识别模块识别到的文本类和数值类实体映射为查询子图的“限制”和“聚合”,利用启发式方法拼接到概念查询子图上,完成完整的查询子图的构建。 结构化查询 - 答案合成模块 由于采用了语义解析方法作为子图匹配模块的技术选型,我们需要一个结构化查询模块将查询子图映射成真正的图谱查询语句,从而在图谱中查询到的就是真正的子图。 从NL2Graph的角度来讲,获得知识图谱子图就已经完成任务了,但是对于问答机器人,我们还需将子图合成为自然语言答案。自然语言生成模型貌似是答案生成模块一个很美好的技术选型,但在实践中,我们发现在垂直领域中,客户对答案的需求更强调以下几点: 答案可解释,可控
答案可以快速地被业务规则干预
除了纯文本,还需要富文本、选项卡、气泡、反问列表等表现形式
综上考虑,我们在实践中使用一种DSL来描述结构化的子图到纯文本和富文本答案的映射规则,并打算让业务人员来编写这种DSL以应对纷繁易变的业务规则。但是,结构化子图本身就是一种知识图谱,用一种DSL来描述它本来就比较困难,且不易理解(试想用自然语言来准确描述如图3中的知识图谱的拓扑结构,需要多少文本)。不过,图谱构建时的图-表格双模式在这里又帮了我们,我们将查询到的子图映射回数据表格,并用表名、列名直观易懂地引用结构化数据。此外,我们还在描述语言中基于平稳退化的原则,设计了表达算术、格式化文本和逻辑分支的语法,在不提高使用难度的情况下增加这种语言的表达能力,以满足不同水平的使用需求。 知识图谱构建 - 关系抽取任务 最后我们聊一下知识图谱的构建。各行业的数据,尤其是非结构化的文本数据,蕴含了大量知识,将它们转化为三元组存入知识图谱是图谱构建的主要任务。 实体抽取、关系抽取和事件抽取是知识图谱构建的核心子任务。追一参加了2020语言与智能技术竞赛的关系抽取任务,并获得了第一名的成绩。该比赛的数据集DuIE2.0包含了43个简单知识类型和5个复杂知识类型,其中的复杂知识类型已经属于事件抽取范畴,因此我们的方案其实覆盖了知识图谱构建的全部流程。 数据建模 复杂知识类型是包含复合属性结点(CVT)的复杂元组,即N-Ary问题。以下面的文本为例: 5月6日 下午三点,金像奖 获奖名单公布,周冬雨 凭借电影**《少年的你》中“陈念”一角获得 金像奖最佳女主角**这个“获奖”知识中,所获奖项、获奖作品、获奖时间、获奖人都是其属性。对此,我们设计了一种用多个简单三元组表达一个复杂的N-Ary元组的方式,该方式可以将复杂元组的信息无损地表达为若干个简单三元组,举例来说,“王雪纯是87版《红楼梦》中晴雯的配音者, 而赵薇是《新红楼》中晴雯的配音 ”,这个句子中王雪纯 为红楼梦 中的晴雯 配音可以表达为: 模型设计 从模型设计上,为了支持复杂元组的抽取,我们设计了一套基于Pointer Network的网络。第一步先做主语预测,然后用把主语信息加入问句,对宾语进行谓语标签的预测。这样每个token都是多标签,理论上可以解决实体重叠和关系重叠。但是宾语和谓语的联合预测带来了输出稀疏的问题,输出层标签绝大多数都是0,少数是1. 这就使网络训练难度上升。 为了解决输出稀疏问题,我们将模型改为三段式框架,将抽取转化为2个序列标注任务和1个分类任务,三个任务共享预训练模型初始化的编码层,进行多任务训练。在使用时进行主语识别,然后将识别到的主语拼接在问句前作为补充信息进行宾语的识别,最后再将宾语拼在头部对谓语进行分类。 随后我们在这一框架下,对模型进行了一系列优化。首先我们选用表达能力强的roberta-wwm-large编码层;其次,我们采用了层级学习率(Discrimitive Learning Rate)的方案,通过调小接近输入层的学习率,避免下游任务对预训时学到知识的灾难性遗忘;我们还尝试了对抗样本、Talking-heads Attention等方法提高模型效果;最后,在初步实验中,我们发现预测结果的precision大大高于recall,且原因是训练集中大量由远程监督生成的false negative的标签,基于此,我们采用了PU Learning的方案,即使用ensemble + vote 的方法生成高质量三元组,训练时忽略这些未标注且ensemble投票大于2的三元组,避免false negative的监督信号降低模型效果。
最终,在加入ensemble和后处理后,我们的模型在任务中获得了0.8235的F1 score,以下是我们所有方案对模型效果的提升
追一科技是国内最早将深度学习用于自然语言处理场景,并进行落地实用的公司之一。我们一直致力于用自然语言处理技术带来更多的可能性。NL2Doc、NL2SQL以及NL2Graph技术是以自然语言对不同文本知识结构进行查询的代表性技术,我们在这一领域将会持续投入,探索更多的可能性。